package com.definity.toolkit.persistence;

import java.io.Serializable;
import java.util.List;

import javax.persistence.Query;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;

import com.definity.toolkit.domain.Domain;

public interface Repository<T extends Domain<? extends Serializable>> {

	void addRepositoryListener(RepositoryListener listener);

	void removeRepositoryListener(RepositoryListener listener);

	List<RepositoryListener> getListeners();
	
	T save(T domain);

	void delete(T domain);

	T findById(Serializable id);

	List<T> findBy(T example, String... attributes);

	List<T> listAll();

	<I extends Serializable> List<T> memberOf(String attribute, Domain<I> domain);

	CriteriaBuilder createCriteriaBuilder();

	List<T> findBy(CriteriaQuery<T> criteria);

	Query createQuery(String hql);
	
	Query createNativeQuery(String hql);
	
	Query createNativeQuery(String hql, Class<?> type);

	void flush();

}
